package com.example.excel_db.validator;

import com.example.excel_db.entity.ExcelTemplate;
import com.example.excel_db.entity.ExcelTemplateField;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 默认Excel数据校验器
 * 提供基本的数据类型校验
 */
@Slf4j
@Component
public class DefaultExcelDataValidator extends AbstractExcelDataValidator {

    /**
     * 构造函数
     *
     * @param template Excel模板
     * @param fields   模板字段列表
     */
    public DefaultExcelDataValidator(ExcelTemplate template, List<ExcelTemplateField> fields) {
        super(template, fields);
    }

    @Override
    protected List<String> doValidateRow(Map<String, Object> rowData, int rowIndex) {
        List<String> errors = new ArrayList<>();

        // 校验数据类型
        for (ExcelTemplateField field : fields) {
            String fieldName = field.getFieldName();
            String fieldType = field.getFieldType();
            Object value = rowData.get(fieldName);

            // 如果值为空且不是必填字段，则跳过校验
            if (value == null || (value instanceof String && ((String) value).trim().isEmpty())) {
                if (!field.isRequired()) {
                    continue;
                }
            } else {
                // 根据字段类型进行校验
                try {
                    switch (fieldType.toLowerCase()) {
                        case "integer":
                        case "int":
                            if (value instanceof String) {
                                Integer.parseInt((String) value);
                            } else if (!(value instanceof Integer)) {
                                errors.add(String.format("第%d行: 字段 '%s' 必须是整数类型", rowIndex + 1, field.getFieldColumn()));
                            }
                            break;
                        case "double":
                        case "float":
                        case "decimal":
                            if (value instanceof String) {
                                Double.parseDouble((String) value);
                            } else if (!(value instanceof Number)) {
                                errors.add(String.format("第%d行: 字段 '%s' 必须是数值类型", rowIndex + 1, field.getFieldColumn()));
                            }
                            break;
                        case "boolean":
                            if (value instanceof String) {
                                String strValue = ((String) value).toLowerCase();
                                if (!strValue.equals("true") && !strValue.equals("false") &&
                                    !strValue.equals("1") && !strValue.equals("0") &&
                                    !strValue.equals("是") && !strValue.equals("否") &&
                                    !strValue.equals("y") && !strValue.equals("n")) {
                                    errors.add(String.format("第%d行: 字段 '%s' 必须是布尔类型", rowIndex + 1, field.getFieldColumn()));
                                }
                            } else if (!(value instanceof Boolean)) {
                                errors.add(String.format("第%d行: 字段 '%s' 必须是布尔类型", rowIndex + 1, field.getFieldColumn()));
                            }
                            break;
                        case "date":
                            // 日期格式校验可以根据具体需求实现
                            break;
                        case "string":
                        default:
                            // 字符串类型不需要特殊校验
                            break;
                    }
                } catch (Exception e) {
                    errors.add(String.format("第%d行: 字段 '%s' 数据格式错误: %s", rowIndex + 1, field.getFieldColumn(), e.getMessage()));
                }
            }
        }

        return errors;
    }

    @Override
    public String getName() {
        return "default";
    }
}